﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Okazuki.MVVM.PrismSupport.Utils;

namespace Okazuki.MVVM.PrismSupport.Test.Utils
{
    [TestClass]
    public class ObjectUtilsTest
    {
        class Person
        {
            public string ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }

        class Employee
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public int Salary { get; set; }
        }

        class AutoInitTestClass
        {
            [AutoInit]
            public Person AutoInitProperty { get; set; }

            public Person NotAutoInitProperty { get; set; }
        }

        public class GuidInitTestClass
        {
            [Guid]
            public string SampleGuid { get; private set; }

            [Guid]
            public string SampleGuid2 { get; private set; }
        }

        [TestMethod]
        public void TestCopyTo()
        {
            var a = new Person
            {
                ID = "10",
                Name = "taro",
                Age = 10
            };
            var b = new Employee
            {
                ID = 1,
                Name = "jiro",
                Age = 50,
                Salary = 10000
            };

            ObjectUtils.CopyTo(a, b);
            Assert.AreEqual(10, b.ID, "型変換も行われているはず");
            Assert.AreEqual(a.Name, b.Name, "プロパティがコピーされて同じ値になっている");
            Assert.AreEqual(a.Age, b.Age, "プロパティがコピーされて同じ値になっている");
            Assert.AreEqual(10000, b.Salary, "Salaryはコピーされていない");
        }

        [TestMethod]
        public void TestCopyToNullValue()
        {
            var a = new Person
            {
                ID = null,
                Name = null
            };
            var b = new Employee
            {
                ID = 1,
                Name = "taro"
            };

            ObjectUtils.CopyTo(a, b);
            Assert.AreEqual(default(int), b.ID, "nullの時はデフォルト値を入れてほしい");
            Assert.IsNull(b.Name, "null値も正しくコピーされる");
        }

        [TestMethod]
        public void TestAutoInit()
        {
            var target = new AutoInitTestClass();
            Assert.IsNull(target.AutoInitProperty, "初期状態ではnull");
            Assert.IsNull(target.NotAutoInitProperty, "初期状態ではnull");

            ObjectUtils.Init(target);
            Assert.IsNotNull(
                target.AutoInitProperty,
                "AutoInit属性がついているのでインスタンスが生成されている");
            Assert.IsNull(
                target.NotAutoInitProperty,
                "AutoInit属性がついていないのでnullのまま");
        }

        [TestMethod]
        public void TestGuid()
        {
            var target = new GuidInitTestClass();
            Assert.IsNull(target.SampleGuid, "初期状態ではnull");
            Assert.IsNull(target.SampleGuid2, "初期状態ではnull");

            ObjectUtils.Init(target);

            Assert.AreNotEqual(target.SampleGuid, target.SampleGuid2);
        }
    }
}
